{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 自然语言处理的基本要素\n",
    "\n",
    "本章节内容节选自 [徒手实现循环神经网络--自然语言处理的基本要素](https://www.bilibili.com/video/BV1cb421n78r)\n",
    "\n",
    "讲解了文本处理最基本的要素，比如分词器、迁移学习。"
   ],
   "id": "abc2966018f2d648"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:53:49.388178Z",
     "start_time": "2025-08-20T11:52:55.677899Z"
    }
   },
   "cell_type": "code",
   "source": "!pip install transformers datasets",
   "id": "1f7873b3dd85c6e5",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting transformers\n",
      "  Downloading transformers-4.55.2-py3-none-any.whl.metadata (41 kB)\n",
      "     ---------------------------------------- 0.0/42.0 kB ? eta -:--:--\n",
      "     ------------------ ------------------- 20.5/42.0 kB 640.0 kB/s eta 0:00:01\n",
      "     -------------------------------------- 42.0/42.0 kB 991.5 kB/s eta 0:00:00\n",
      "Collecting datasets\n",
      "  Using cached datasets-4.0.0-py3-none-any.whl.metadata (19 kB)\n",
      "Requirement already satisfied: filelock in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from transformers) (3.13.1)\n",
      "Collecting huggingface-hub<1.0,>=0.34.0 (from transformers)\n",
      "  Using cached huggingface_hub-0.34.4-py3-none-any.whl.metadata (14 kB)\n",
      "Requirement already satisfied: numpy>=1.17 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from transformers) (2.1.2)\n",
      "Requirement already satisfied: packaging>=20.0 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from transformers) (25.0)\n",
      "Requirement already satisfied: pyyaml>=5.1 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from transformers) (6.0.2)\n",
      "Collecting regex!=2019.12.17 (from transformers)\n",
      "  Downloading regex-2025.7.34-cp311-cp311-win_amd64.whl.metadata (41 kB)\n",
      "     ---------------------------------------- 0.0/41.5 kB ? eta -:--:--\n",
      "     ---------------------------------------- 41.5/41.5 kB 2.1 MB/s eta 0:00:00\n",
      "Requirement already satisfied: requests in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from transformers) (2.32.4)\n",
      "Collecting tokenizers<0.22,>=0.21 (from transformers)\n",
      "  Downloading tokenizers-0.21.4-cp39-abi3-win_amd64.whl.metadata (6.9 kB)\n",
      "Collecting safetensors>=0.4.3 (from transformers)\n",
      "  Downloading safetensors-0.6.2-cp38-abi3-win_amd64.whl.metadata (4.1 kB)\n",
      "Collecting tqdm>=4.27 (from transformers)\n",
      "  Using cached tqdm-4.67.1-py3-none-any.whl.metadata (57 kB)\n",
      "Collecting pyarrow>=15.0.0 (from datasets)\n",
      "  Using cached pyarrow-21.0.0-cp311-cp311-win_amd64.whl.metadata (3.4 kB)\n",
      "Collecting dill<0.3.9,>=0.3.0 (from datasets)\n",
      "  Using cached dill-0.3.8-py3-none-any.whl.metadata (10 kB)\n",
      "Requirement already satisfied: pandas in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from datasets) (2.3.1)\n",
      "Collecting xxhash (from datasets)\n",
      "  Using cached xxhash-3.5.0-cp311-cp311-win_amd64.whl.metadata (13 kB)\n",
      "Collecting multiprocess<0.70.17 (from datasets)\n",
      "  Using cached multiprocess-0.70.16-py311-none-any.whl.metadata (7.2 kB)\n",
      "Requirement already satisfied: fsspec<=2025.3.0,>=2023.1.0 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2024.6.1)\n",
      "Collecting aiohttp!=4.0.0a0,!=4.0.0a1 (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Downloading aiohttp-3.12.15-cp311-cp311-win_amd64.whl.metadata (7.9 kB)\n",
      "Requirement already satisfied: typing-extensions>=3.7.4.3 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from huggingface-hub<1.0,>=0.34.0->transformers) (4.12.2)\n",
      "Requirement already satisfied: charset_normalizer<4,>=2 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from requests->transformers) (3.4.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from requests->transformers) (3.10)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from requests->transformers) (2.5.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from requests->transformers) (2025.7.14)\n",
      "Requirement already satisfied: colorama in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from tqdm>=4.27->transformers) (0.4.6)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from pandas->datasets) (2.9.0.post0)\n",
      "Requirement already satisfied: pytz>=2020.1 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from pandas->datasets) (2025.2)\n",
      "Requirement already satisfied: tzdata>=2022.7 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from pandas->datasets) (2025.2)\n",
      "Collecting aiohappyeyeballs>=2.5.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Using cached aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB)\n",
      "Collecting aiosignal>=1.4.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Using cached aiosignal-1.4.0-py3-none-any.whl.metadata (3.7 kB)\n",
      "Requirement already satisfied: attrs>=17.3.0 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (25.3.0)\n",
      "Collecting frozenlist>=1.1.1 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Using cached frozenlist-1.7.0-cp311-cp311-win_amd64.whl.metadata (19 kB)\n",
      "Collecting multidict<7.0,>=4.5 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Downloading multidict-6.6.4-cp311-cp311-win_amd64.whl.metadata (5.4 kB)\n",
      "Collecting propcache>=0.2.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Using cached propcache-0.3.2-cp311-cp311-win_amd64.whl.metadata (12 kB)\n",
      "Collecting yarl<2.0,>=1.17.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n",
      "  Using cached yarl-1.20.1-cp311-cp311-win_amd64.whl.metadata (76 kB)\n",
      "Requirement already satisfied: six>=1.5 in e:\\programming\\python\\deeplearning\\venv\\lib\\site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n",
      "Downloading transformers-4.55.2-py3-none-any.whl (11.3 MB)\n",
      "   ---------------------------------------- 0.0/11.3 MB ? eta -:--:--\n",
      "   ---------------------------------------- 0.0/11.3 MB 1.9 MB/s eta 0:00:06\n",
      "    --------------------------------------- 0.2/11.3 MB 1.8 MB/s eta 0:00:07\n",
      "   - -------------------------------------- 0.4/11.3 MB 2.8 MB/s eta 0:00:04\n",
      "   -- ------------------------------------- 0.7/11.3 MB 4.1 MB/s eta 0:00:03\n",
      "   ---- ----------------------------------- 1.3/11.3 MB 6.0 MB/s eta 0:00:02\n",
      "   ----- ---------------------------------- 1.6/11.3 MB 6.0 MB/s eta 0:00:02\n",
      "   -------- ------------------------------- 2.4/11.3 MB 7.8 MB/s eta 0:00:02\n",
      "   ---------- ----------------------------- 3.0/11.3 MB 8.4 MB/s eta 0:00:01\n",
      "   -------------- ------------------------- 4.0/11.3 MB 10.3 MB/s eta 0:00:01\n",
      "   -------------- ------------------------- 4.0/11.3 MB 10.3 MB/s eta 0:00:01\n",
      "   -------------- ------------------------- 4.0/11.3 MB 10.3 MB/s eta 0:00:01\n",
      "   --------------------- ------------------ 6.0/11.3 MB 10.9 MB/s eta 0:00:01\n",
      "   ----------------------- ---------------- 6.7/11.3 MB 11.6 MB/s eta 0:00:01\n",
      "   --------------------------- ------------ 7.9/11.3 MB 12.3 MB/s eta 0:00:01\n",
      "   ------------------------------- -------- 8.9/11.3 MB 13.2 MB/s eta 0:00:01\n",
      "   --------------------------------- ------ 9.4/11.3 MB 13.1 MB/s eta 0:00:01\n",
      "   ------------------------------------- -- 10.7/11.3 MB 16.4 MB/s eta 0:00:01\n",
      "   ------------------------------------- -- 10.7/11.3 MB 16.4 MB/s eta 0:00:01\n",
      "   ---------------------------------------- 11.3/11.3 MB 15.6 MB/s eta 0:00:00\n",
      "Using cached datasets-4.0.0-py3-none-any.whl (494 kB)\n",
      "Using cached dill-0.3.8-py3-none-any.whl (116 kB)\n",
      "Using cached huggingface_hub-0.34.4-py3-none-any.whl (561 kB)\n",
      "Using cached multiprocess-0.70.16-py311-none-any.whl (143 kB)\n",
      "Using cached pyarrow-21.0.0-cp311-cp311-win_amd64.whl (26.2 MB)\n",
      "Downloading regex-2025.7.34-cp311-cp311-win_amd64.whl (276 kB)\n",
      "   ---------------------------------------- 0.0/276.0 kB ? eta -:--:--\n",
      "   --------------------------------------- 276.0/276.0 kB 16.6 MB/s eta 0:00:00\n",
      "Downloading safetensors-0.6.2-cp38-abi3-win_amd64.whl (320 kB)\n",
      "   ---------------------------------------- 0.0/320.2 kB ? eta -:--:--\n",
      "   --------------------------------------- 320.2/320.2 kB 10.0 MB/s eta 0:00:00\n",
      "Downloading tokenizers-0.21.4-cp39-abi3-win_amd64.whl (2.5 MB)\n",
      "   ---------------------------------------- 0.0/2.5 MB ? eta -:--:--\n",
      "   ------------- -------------------------- 0.8/2.5 MB 27.1 MB/s eta 0:00:01\n",
      "   ---------------------------- ----------- 1.8/2.5 MB 22.7 MB/s eta 0:00:01\n",
      "   ---------------------------------------- 2.5/2.5 MB 20.0 MB/s eta 0:00:00\n",
      "Using cached tqdm-4.67.1-py3-none-any.whl (78 kB)\n",
      "Using cached xxhash-3.5.0-cp311-cp311-win_amd64.whl (30 kB)\n",
      "Downloading aiohttp-3.12.15-cp311-cp311-win_amd64.whl (453 kB)\n",
      "   ---------------------------------------- 0.0/453.3 kB ? eta -:--:--\n",
      "   ---------------------------------------- 453.3/453.3 kB 9.4 MB/s eta 0:00:00\n",
      "Using cached aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB)\n",
      "Using cached aiosignal-1.4.0-py3-none-any.whl (7.5 kB)\n",
      "Using cached frozenlist-1.7.0-cp311-cp311-win_amd64.whl (44 kB)\n",
      "Downloading multidict-6.6.4-cp311-cp311-win_amd64.whl (46 kB)\n",
      "   ---------------------------------------- 0.0/46.0 kB ? eta -:--:--\n",
      "   ---------------------------------------- 46.0/46.0 kB ? eta 0:00:00\n",
      "Using cached propcache-0.3.2-cp311-cp311-win_amd64.whl (41 kB)\n",
      "Using cached yarl-1.20.1-cp311-cp311-win_amd64.whl (86 kB)\n",
      "Installing collected packages: xxhash, tqdm, safetensors, regex, pyarrow, propcache, multidict, frozenlist, dill, aiohappyeyeballs, yarl, multiprocess, huggingface-hub, aiosignal, tokenizers, aiohttp, transformers, datasets\n",
      "Successfully installed aiohappyeyeballs-2.6.1 aiohttp-3.12.15 aiosignal-1.4.0 datasets-4.0.0 dill-0.3.8 frozenlist-1.7.0 huggingface-hub-0.34.4 multidict-6.6.4 multiprocess-0.70.16 propcache-0.3.2 pyarrow-21.0.0 regex-2025.7.34 safetensors-0.6.2 tokenizers-0.21.4 tqdm-4.67.1 transformers-4.55.2 xxhash-3.5.0 yarl-1.20.1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "[notice] A new release of pip is available: 24.0 -> 25.2\n",
      "[notice] To update, run: python.exe -m pip install --upgrade pip\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:54:35.635906Z",
     "start_time": "2025-08-20T11:54:09.785322Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from transformers import AutoTokenizer\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "tokenizer_gpt2 = AutoTokenizer.from_pretrained('gpt2')"
   ],
   "id": "ee7becc99dee1950",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tokenizer_config.json:   0%|          | 0.00/26.0 [00:00<?, ?B/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "5c87b5e530144b228abb6dc23df14fc3"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "config.json:   0%|          | 0.00/665 [00:00<?, ?B/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "bceb6981bb5c4db991adec20d246ae2b"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "vocab.json:   0%|          | 0.00/1.04M [00:00<?, ?B/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "88df2816001f433aa4ce97f6c805e4d3"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "merges.txt:   0%|          | 0.00/456k [00:00<?, ?B/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "f906c7992724471592c7a862c0f43b9e"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "tokenizer.json:   0%|          | 0.00/1.36M [00:00<?, ?B/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "74d11a79b0f548399953cc86163aeb77"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:54:48.552506Z",
     "start_time": "2025-08-20T11:54:48.548589Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 分词效果示例，三段文本表示的意思是相近的\n",
    "text_fr = '''Évariste Galois (/ɡælˈwɑː/; français : [evaʁist ɡalwa] ; 25 octobre 1811 - 31 mai 1832) était un mathématicien français et un militant politique. Alors qu'il était encore adolescent, il parvint à déterminer une condition nécessaire et suffisante pour qu'un polynôme soit résoluble par des radicaux, résolvant ainsi un problème qui était resté ouvert pendant 350 ans. Son travail posa les fondements de la théorie de Galois et de la théorie des groupes, deux branches majeures de l'algèbre abstraite. Il était un fervent républicain et fut très impliqué dans les troubles politiques qui entourèrent la Révolution française de 1830. En raison de son activisme politique, il fut arrêté à plusieurs reprises, purgé une peine de plusieurs mois de prison. Pour des raisons restées obscures, peu de temps après sa libération de prison, il se battit en duel et décéda des blessures qu'il subit.'''\n",
    "text_en = '''Évariste Galois (/ɡælˈwɑː/; French: [evaʁist ɡalwa]; 25 October 1811 – 31 May 1832) was a French mathematician and political activist. While still in his teens, he was able to determine a necessary and sufficient condition for a polynomial to be solvable by radicals, thereby solving a problem that had been open for 350 years. His work laid the foundations for Galois theory and group theory, two major branches of abstract algebra. He was a staunch republican and was heavily involved in the political turmoil that surrounded the French Revolution of 1830. As a result of his political activism, he was arrested repeatedly, serving one jail sentence of several months. For reasons that remain obscure, shortly after his release from prison he fought in a duel and died of the wounds he suffered.'''\n",
    "text_zh = '''埃瓦里斯特·伽罗瓦（法语：Évariste Galois，1811年10月25日—1832年5月31日，法语发音： [evaʁist ɡalwa]）是一位法国数学家和政治活动家。尽管还在十几岁时，他就能够确定多项式能够通过根式求解的充分必要条件，从而解决了一个悬而未决的问题，该问题已经存在了350年。他的工作奠定了Galois理论和群论的基础，这两个是抽象代数的重要分支。他是一位坚定的共和派，深度参与了1830年法国大革命期间的政治动荡。由于他的政治活动，他多次被逮捕，其中一次入狱数月。由于原因不明，他在刑满释放后不久，参与了一场决斗并因受伤而去世。'''\n",
    "\n",
    "texts = {\n",
    "    'fr': text_fr,\n",
    "    'en': text_en,\n",
    "    'zh': text_zh\n",
    "}"
   ],
   "id": "e6499ca7f6704dfd",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:55:00.157557Z",
     "start_time": "2025-08-20T11:55:00.146193Z"
    }
   },
   "cell_type": "code",
   "source": [
    "re = tokenizer_gpt2.encode(text_en)\n",
    "re"
   ],
   "id": "2aec72e0c881fcf6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[38351,\n",
       " 7785,\n",
       " 40833,\n",
       " 5027,\n",
       " 10924,\n",
       " 50247,\n",
       " 133,\n",
       " 94,\n",
       " 21241,\n",
       " 75,\n",
       " 45990,\n",
       " 86,\n",
       " 133,\n",
       " 239,\n",
       " 135,\n",
       " 238,\n",
       " 14,\n",
       " 26,\n",
       " 4141,\n",
       " 25,\n",
       " 685,\n",
       " 48855,\n",
       " 134,\n",
       " 223,\n",
       " 396,\n",
       " 220,\n",
       " 133,\n",
       " 94,\n",
       " 282,\n",
       " 10247,\n",
       " 11208,\n",
       " 1679,\n",
       " 3267,\n",
       " 1248,\n",
       " 1157,\n",
       " 784,\n",
       " 3261,\n",
       " 1737,\n",
       " 1248,\n",
       " 2624,\n",
       " 8,\n",
       " 373,\n",
       " 257,\n",
       " 4141,\n",
       " 48251,\n",
       " 290,\n",
       " 1964,\n",
       " 11276,\n",
       " 13,\n",
       " 2893,\n",
       " 991,\n",
       " 287,\n",
       " 465,\n",
       " 15508,\n",
       " 11,\n",
       " 339,\n",
       " 373,\n",
       " 1498,\n",
       " 284,\n",
       " 5004,\n",
       " 257,\n",
       " 3306,\n",
       " 290,\n",
       " 6751,\n",
       " 4006,\n",
       " 329,\n",
       " 257,\n",
       " 745,\n",
       " 6213,\n",
       " 49070,\n",
       " 284,\n",
       " 307,\n",
       " 1540,\n",
       " 23765,\n",
       " 416,\n",
       " 32842,\n",
       " 11,\n",
       " 12839,\n",
       " 18120,\n",
       " 257,\n",
       " 1917,\n",
       " 326,\n",
       " 550,\n",
       " 587,\n",
       " 1280,\n",
       " 329,\n",
       " 13803,\n",
       " 812,\n",
       " 13,\n",
       " 2399,\n",
       " 670,\n",
       " 8104,\n",
       " 262,\n",
       " 19369,\n",
       " 329,\n",
       " 5027,\n",
       " 10924,\n",
       " 4583,\n",
       " 290,\n",
       " 1448,\n",
       " 4583,\n",
       " 11,\n",
       " 734,\n",
       " 1688,\n",
       " 13737,\n",
       " 286,\n",
       " 12531,\n",
       " 37139,\n",
       " 13,\n",
       " 679,\n",
       " 373,\n",
       " 257,\n",
       " 34700,\n",
       " 41477,\n",
       " 290,\n",
       " 373,\n",
       " 7272,\n",
       " 2950,\n",
       " 287,\n",
       " 262,\n",
       " 1964,\n",
       " 26962,\n",
       " 326,\n",
       " 11191,\n",
       " 262,\n",
       " 4141,\n",
       " 9303,\n",
       " 286,\n",
       " 45440,\n",
       " 13,\n",
       " 1081,\n",
       " 257,\n",
       " 1255,\n",
       " 286,\n",
       " 465,\n",
       " 1964,\n",
       " 23034,\n",
       " 11,\n",
       " 339,\n",
       " 373,\n",
       " 5169,\n",
       " 7830,\n",
       " 11,\n",
       " 7351,\n",
       " 530,\n",
       " 7356,\n",
       " 6827,\n",
       " 286,\n",
       " 1811,\n",
       " 1933,\n",
       " 13,\n",
       " 1114,\n",
       " 3840,\n",
       " 326,\n",
       " 3520,\n",
       " 18611,\n",
       " 11,\n",
       " 8972,\n",
       " 706,\n",
       " 465,\n",
       " 2650,\n",
       " 422,\n",
       " 3770,\n",
       " 339,\n",
       " 8350,\n",
       " 287,\n",
       " 257,\n",
       " 24662,\n",
       " 290,\n",
       " 3724,\n",
       " 286,\n",
       " 262,\n",
       " 14129,\n",
       " 339,\n",
       " 6989,\n",
       " 13]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:55:21.220551Z",
     "start_time": "2025-08-20T11:55:21.215584Z"
    }
   },
   "cell_type": "code",
   "source": "'_'.join([tokenizer_gpt2.decode(i) for i in tokenizer_gpt2.encode(text_en)])  # 分词的效果",
   "id": "593ff7d3f2fa4969",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'É_var_iste_ Gal_ois_ (/_�_�_æ_l_ˈ_w_�_�_�_�_/_;_ French_:_ [_eva_�_�_ist_ _�_�_al_wa_];_ 25_ October_ 18_11_ –_ 31_ May_ 18_32_)_ was_ a_ French_ mathematician_ and_ political_ activist_._ While_ still_ in_ his_ teens_,_ he_ was_ able_ to_ determine_ a_ necessary_ and_ sufficient_ condition_ for_ a_ po_lyn_omial_ to_ be_ sol_vable_ by_ radicals_,_ thereby_ solving_ a_ problem_ that_ had_ been_ open_ for_ 350_ years_._ His_ work_ laid_ the_ foundations_ for_ Gal_ois_ theory_ and_ group_ theory_,_ two_ major_ branches_ of_ abstract_ algebra_._ He_ was_ a_ staunch_ republican_ and_ was_ heavily_ involved_ in_ the_ political_ turmoil_ that_ surrounded_ the_ French_ Revolution_ of_ 1830_._ As_ a_ result_ of_ his_ political_ activism_,_ he_ was_ arrested_ repeatedly_,_ serving_ one_ jail_ sentence_ of_ several_ months_._ For_ reasons_ that_ remain_ obscure_,_ shortly_ after_ his_ release_ from_ prison_ he_ fought_ in_ a_ duel_ and_ died_ of_ the_ wounds_ he_ suffered_.'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:55:32.383483Z",
     "start_time": "2025-08-20T11:55:32.374432Z"
    }
   },
   "cell_type": "code",
   "source": "'_'.join([tokenizer_gpt2.decode(i) for i in tokenizer_gpt2.encode(text_fr)])  # 相较于英文，将词语切的比较碎",
   "id": "cc5f5916aab75e22",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"É_var_iste_ Gal_ois_ (/_�_�_æ_l_ˈ_w_�_�_�_�_/_;_ fr_an_ç_ais_ :_ [_eva_�_�_ist_ _�_�_al_wa_]_ ;_ 25_ oct_ob_re_ 18_11_ -_ 31_ m_ai_ 18_32_)_ _ét_ait_ un_ math_é_matic_ien_ fr_an_ç_ais_ et_ un_ militant_ polit_ique_._ Al_ors_ qu_'_il_ _ét_ait_ enc_ore_ adolescent_,_ il_ par_v_int_ à_ dé_termin_er_ une_ condition_ n_é_cess_aire_ et_ suff_is_ante_ pour_ qu_'_un_ po_lyn_ô_me_ so_it_ r_és_ol_uble_ par_ des_ rad_ic_aux_,_ r_és_ol_vant_ a_ins_i_ un_ prob_l_è_me_ qui_ _ét_ait_ rest_é_ o_u_vert_ p_endant_ 350_ ans_._ Son_ tra_v_ail_ pos_a_ les_ fond_ements_ de_ la_ th_é_orie_ de_ Gal_ois_ et_ de_ la_ th_é_orie_ des_ group_es_,_ de_ux_ branches_ maj_e_ures_ de_ l_'_alg_è_bre_ ab_stra_ite_._ Il_ _ét_ait_ un_ ferv_ent_ ré_public_ain_ et_ fut_ tr_è_s_ impl_iqu_é_ d_ans_ les_ troubles_ polit_iques_ qui_ ent_our_è_rent_ la_ Ré_v_olution_ fr_an_ça_ise_ de_ 1830_._ En_ ra_ison_ de_ son_ activism_e_ polit_ique_,_ il_ fut_ arr_ê_t_é_ à_ plus_ie_urs_ re_prises_,_ pur_g_é_ une_ pe_ine_ de_ plus_ie_urs_ mo_is_ de_ prison_._ Pour_ des_ ra_isons_ rest_é_es_ obsc_ures_,_ pe_u_ de_ tem_ps_ apr_è_s_ sa_ lib_é_ration_ de_ prison_,_ il_ se_ batt_it_ en_ duel_ et_ dé_cé_da_ des_ bless_ures_ qu_'_il_ sub_it_.\""
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:56:07.966032Z",
     "start_time": "2025-08-20T11:56:07.957557Z"
    }
   },
   "cell_type": "code",
   "source": "'_'.join([tokenizer_gpt2.decode(i) for i in tokenizer_gpt2.encode(text_zh)])",
   "id": "4dcb5288432a42c8",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'�_�_�_�_�_�_�_�_�_�_�_�_·_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_É_var_iste_ Gal_ois_�_�_�_18_11_�_�_10_�_�_25_�_�_—_18_32_�_�_5_�_�_31_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_ [_eva_�_�_ist_ _�_�_al_wa_]_�_�_�_是_一_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_。_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_��_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_一_�_�_�_��_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_350_�_�_。_�_�_的_�_�_作_�_�_�_�_�_�_G_alo_is_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_是_�_�_�_�_�_�_代_�_�_的_�_�_�_�_�_�_�_�_�_。_�_�_是_一_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_18_30_�_�_�_�_�_�_大_�_�_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_。_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_中_一_�_�_�_�_�_�_�_�_�_�_�_。_�_�_�_�_�_�_�_�_不_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_不_�_�_�_�_�_�_�_�_�_�_�_一_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_。'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:58:25.428894Z",
     "start_time": "2025-08-20T11:58:25.425396Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def get_token_stats(tokenizer):\n",
    "    str_stats = {}\n",
    "    token_stats = {}\n",
    "    for (k, v) in texts.items():\n",
    "        str_stats[k] = len(v.split()) if k != 'zh' else len(v)  # 将分词之前的字数与之后的字数相比较，如果是中文就按照中文字个数，不是中文就按空格分割看单词数\n",
    "        token_stats[k] = len(tokenizer.encode(v))\n",
    "    return str_stats, token_stats"
   ],
   "id": "76cb2de479e7148b",
   "outputs": [],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:58:35.841293Z",
     "start_time": "2025-08-20T11:58:35.835299Z"
    }
   },
   "cell_type": "code",
   "source": "get_token_stats(tokenizer_gpt2)",
   "id": "6b3887d362d814e2",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({'fr': 142, 'en': 132, 'zh': 278}, {'fr': 307, 'en': 176, 'zh': 497})"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:58:49.716276Z",
     "start_time": "2025-08-20T11:58:49.709175Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def draw_bar(str_stats, token_stats):\n",
    "    # 将统计结果可视化\n",
    "    fig = plt.figure(figsize=(6, 6), dpi=80)\n",
    "    plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "    plt.rcParams['axes.unicode_minus'] = False\n",
    "    plt.rcParams.update({'font.size': 13})\n",
    "    bar_width = 0.1\n",
    "    base = range(len(str_stats))\n",
    "    br_str = [x - bar_width for x in base]\n",
    "    br_token = [x + bar_width for x in base]\n",
    "    plt.bar(br_str, str_stats.values(), color ='g',\n",
    "            width = bar_width * 2, label ='文本长度')\n",
    "    plt.bar(br_token, token_stats.values(), color ='b',\n",
    "            width = bar_width * 2, label ='分词后的长度')\n",
    "    plt.xticks([r for r in base], str_stats.keys(), fontsize=18)\n",
    "    plt.legend(shadow=True)\n",
    "    return fig"
   ],
   "id": "27af7b489b1fda95",
   "outputs": [],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T11:59:11.214630Z",
     "start_time": "2025-08-20T11:59:11.118983Z"
    }
   },
   "cell_type": "code",
   "source": "draw_bar(*get_token_stats(tokenizer_gpt2))",
   "id": "d766cb95e8e771f6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ],
      "image/png": "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CRPUqVOnKutkZmbq1ltv1Zw5c/TGG2+orKxMdrvdOt+SkhJt27ZNGzduZFlxwMMxMMGwffv2afv27brzzjutbZmZmfL393frDfyS0+lUfHy8nE6nPvvsMwUHB6tbt27V3qRPT0/X0aNHrUtiZ3M+azQ98MAD6tOnj06dOqWCgoIaBULnzp314IMPKiYmRjk5OVXW2b9/v9q2bas//elPSktL04ABAzR48GClpKToyy+/VHl5uaZOnUoAAVcAekIG5eXlacyYMbr33nsVGhpqbc/IyFBQUFCVgeFyufTYY4/J4XCobdu2uv3225WYmKjCwkJr6PavrVixQtdee61atGhxXr2nqvyyp9SkSRO9/vrrkqQTJ06cNRTy8vI0YcIEfffdd9q0aZOioqJ08803a9WqVbr22mutejk5OdqxY4d1/0eS5s+fr/79+8tms2njxo0aP368NTQcgGejJ2RIcnKyevfurcDAQC1btkxSxWW47du3a/ny5br66qsrvefIkSM6cuSIWrdurbVr12rgwIF65ZVXJFXMpnDmsllOTo4VNj/++KPmz5+vhx56SFJFL2rr1q0KCgqq9Nq6davbvZwz/26322W329WzZ0+VlZVValdpaam+/vprtyA94/jx45Kkvn37KjU1VcuWLVNgYKA++eQTRURE6IYbbtCoUaOsmRoSEhLUu3dvNWnSRFLFQ6p79uxRRESEnn/+eaWlpSkwMFDffvutsrKyajzjAoC6iRAyYN26dbr55psVHR2t9evXW0OTy8rKFBUVpfz8fL3wwguV3ud0OnXXXXfpvffek4+Pj+x2uzp06OBWZ8yYMerTp49uv/12SbIGAcTGxkqqCJabbrpJGRkZlV433XSTCgoKrH3Vq1dPgwYNUm5urnJzc5Wenm7tR6ro3fTs2VO9e/dWeHi4Ro0aVanNu3fvlo+Pj6ZMmaItW7bohhtukFQRmu+++64SExPlcDis4d6FhYWKi4vTxx9/rIiICHXo0EEzZsxQ7969lZOTozVr1ujf//63/vjHPyokJEQOh6Pay3oA6j6bq45OxlXdmuTl5eVKSUlReHj4ed2/qGuysrLUsmXLS77f5ORklZaWKjIyssrnfE6dOqXCwsJq7zedr7KyMvn4+Jy1zsGDB897NFtZWZmOHDly1sEZLpdLOTk51S4rfuazsnXrVl199dXVPsgL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"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ],
      "image/png": "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CRPUqVOnKutkZmbq1ltv1Zw5c/TGG2+orKxMdrvdOt+SkhJt27ZNGzduZFlxwMMxMMGwffv2afv27brzzjutbZmZmfL393frDfyS0+lUfHy8nE6nPvvsMwUHB6tbt27V3qRPT0/X0aNHrUtiZ3M+azQ98MAD6tOnj06dOqWCgoIaBULnzp314IMPKiYmRjk5OVXW2b9/v9q2bas//elPSktL04ABAzR48GClpKToyy+/VHl5uaZOnUoAAVcAekIG5eXlacyYMbr33nsVGhpqbc/IyFBQUFCVgeFyufTYY4/J4XCobdu2uv3225WYmKjCwkJr6PavrVixQtdee61atGhxXr2nqvyyp9SkSRO9/vrrkqQTJ06cNRTy8vI0YcIEfffdd9q0aZOioqJ08803a9WqVbr22mutejk5OdqxY4d1/0eS5s+fr/79+8tms2njxo0aP368NTQcgGejJ2RIcnKyevfurcDAQC1btkxSxWW47du3a/ny5br66qsrvefIkSM6cuSIWrdurbVr12rgwIF65ZVXJFXMpnDmsllOTo4VNj/++KPmz5+vhx56SFJFL2rr1q0KCgqq9Nq6davbvZwz/26322W329WzZ0+VlZVValdpaam+/vprtyA94/jx45Kkvn37KjU1VcuWLVNgYKA++eQTRURE6IYbbtCoUaOsmRoSEhLUu3dvNWnSRFLFQ6p79uxRRESEnn/+eaWlpSkwMFDffvutsrKyajzjAoC6iRAyYN26dbr55psVHR2t9evXW0OTy8rKFBUVpfz8fL3wwguV3ud0OnXXXXfpvffek4+Pj+x2uzp06OBWZ8yYMerTp49uv/12SbIGAcTGxkqqCJabbrpJGRkZlV433XSTCgoKrH3Vq1dPgwYNUm5urnJzc5Wenm7tR6ro3fTs2VO9e/dWeHi4Ro0aVanNu3fvlo+Pj6ZMmaItW7bohhtukFQRmu+++64SExPlcDis4d6FhYWKi4vTxx9/rIiICHXo0EEzZsxQ7969lZOTozVr1ujf//63/vjHPyokJEQOh6Pay3oA6j6bq45OxlXdmuTl5eVKSUlReHj4ed2/qGuysrLUsmXLS77f5ORklZaWKjIyssrnfE6dOqXCwsJq7zedr7KyMvn4+Jy1zsGDB897NFtZWZmOHDly1sEZLpdLOTk51S4rfuazsnXrVl199dXVPsgL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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:03:25.653890Z",
     "start_time": "2025-08-20T12:03:05.692060Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from datasets import load_dataset\n",
    "\n",
    "# 下载中文的语料库\n",
    "data = load_dataset('BelleGroup/train_0.5M_CN')"
   ],
   "id": "e780b83d51ea3e62",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Xet Storage is enabled for this repo, but the 'hf_xet' package is not installed. Falling back to regular HTTP download. For better performance, install the package with: `pip install huggingface_hub[hf_xet]` or `pip install hf_xet`\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(…)e30fdfd32507671a97d3c5059c85a020a2e59ae3:   0%|          | 0.00/286M [00:00<?, ?B/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "0ab76a7d358249448b1d1fb4231fd60e"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "Generating train split:   0%|          | 0/519255 [00:00<?, ? examples/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "28607aa229ab4ea1a69b9e858499679b"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:08:48.230895Z",
     "start_time": "2025-08-20T12:08:48.224237Z"
    }
   },
   "cell_type": "code",
   "source": "data['train'][1]",
   "id": "877c0371e6fbd996",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'instruction': '给定一个文字输入，将其中的所有数字加1。\\n“明天的会议在9点开始，记得准时到达。”\\n',\n",
       " 'input': '',\n",
       " 'output': '“明天的会议在10点开始，记得准时到达。”'}"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:10:06.763469Z",
     "start_time": "2025-08-20T12:10:06.758777Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def get_training_corpus():\n",
    "    d = data['train'].select(range(10000))\n",
    "    batch_size = 1000\n",
    "    for i in range(0, len(d), batch_size):\n",
    "        samples = d[i: i + batch_size]\n",
    "        yield samples.get('instruction', [])"
   ],
   "id": "69b4c9b7a0262dca",
   "outputs": [],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:10:14.089479Z",
     "start_time": "2025-08-20T12:10:12.701448Z"
    }
   },
   "cell_type": "code",
   "source": "tokenizer_zh = tokenizer_gpt2.train_new_from_iterator(get_training_corpus(), 800)",
   "id": "bf10b781130dd779",
   "outputs": [],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:10:25.052959Z",
     "start_time": "2025-08-20T12:10:25.046362Z"
    }
   },
   "cell_type": "code",
   "source": "'_'.join([tokenizer_zh.decode(i) for i in tokenizer_zh.encode(text_zh)])",
   "id": "459c769bc3053637",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'�_�_�_�_�_里_�_�_特_�_�_�_�_�_�_�_�_�_（_法_语_：_�_�_v_a_r_is_t_e_ _G_a_l_o_is_，_1_8_1_1_年_1_0_�_�_2_5_日_�_�_1_8_3_2_年_5_�_�_3_1_日_，_法_语_发_�_�_�_：_ _[_e_v_a_�_�_is_t_ _�_�_a_l_w_a_]_）_是_一_位_法_国_数_学_家_和_�_�_�_�_活_动_家_。_�_�_�_�_还_在_�_�_�_�_�_�_�_时_，_他_�_�_能_�_�_确_定_多_项_式_能_�_�_通_过_根_式_求_解_的_�_�_分_�_�_要_�_�_件_，_从_而_解_�_�_了_一个_�_�_而_�_�_�_�_的_问题_，_该_问题_�_�_经_�_�_在_了_3_5_0_年_。_他_的_工作_�_�_定_了_G_a_l_o_is_理_论_和_�_�_论_的_�_�_�_�_，_这_两个_是_�_�_�_�_�_�_�_数_的_重_要_分_�_�_。_他_是_一_位_�_�_定_的_�_�_和_�_�_，_�_�_�_度_�_�_与_了_1_8_3_0_年_法_国_大_�_�_�_�_期_间_的_�_�_�_�_动_�_�_�_。_�_�_于_他_的_�_�_�_�_活_动_，_他_多_�_�_�_�_�_�_�_�_�_，_其_中_一_�_�_入_�_�_数_�_�_。_�_�_于_�_�_因_不_明_，_他_在_�_�_�_�_�_�_�_�_�_后_不_�_�_，_�_�_与_了_一_场_�_�_�_�_并_因_�_�_�_�_而_去_�_�_。'"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:10:36.000538Z",
     "start_time": "2025-08-20T12:10:35.993169Z"
    }
   },
   "cell_type": "code",
   "source": "'_'.join([tokenizer_zh.decode(i) for i in tokenizer_zh.encode(text_en)])",
   "id": "8087d192dfb266b7",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'�_�_v_a_r_is_t_e_ _G_a_l_o_is_ _(_/_�_�_�_�_l_�_�_w_�_�_�_�_/_;_ _F_re_n_c_h_:_ _[_e_v_a_�_�_is_t_ _�_�_a_l_w_a_]_;_ _2_5_ _O_c_t_o_b_er_ 1_8_1_1_ _�_�_ _3_1_ _M_a_y_ 1_8_3_2_)_ w_a_s_ a_ _F_re_n_c_h_ _m_at_he_m_at_ic_i_an_ a_n_d_ _p_o_l_i_t_ic_a_l_ a_c_t_i_v_is_t_._ _W_h_i_le_ s_t_i_l_l_ _in_ _h_is_ t_e_en_s_,_ _he_ w_a_s_ a_b_le_ t_o_ _d_e_t_er_m_in_e_ a_ _n_e_c_e_s_s_a_r_y_ a_n_d_ s_u_f_f_ic_i_en_t_ _c_on_d_i_t_i_on_ f_or_ a_ _p_o_l_y_n_om_i_a_l_ t_o_ b_e_ s_o_l_v_a_b_le_ b_y_ _r_a_d_ic_a_l_s_,_ the_re_b_y_ s_o_l_v_ing_ a_ _p_r_o_b_le_m_ t_h_at_ _h_a_d_ b_e_en_ _o_p_en_ f_or_ _3_5_0_ _y_e_a_r_s_._ _H_is_ w_or_k_ _l_a_i_d_ the_ f_o_u_n_d_at_i_on_s_ f_or_ _G_a_l_o_is_ the_or_y_ a_n_d_ _g_r_o_u_p_ the_or_y_,_ t_w_o_ _m_a_j_or_ b_r_an_c_he_s_ _o_f_ a_b_s_t_r_a_c_t_ a_l_g_e_b_r_a_._ _H_e_ w_a_s_ a_ s_t_a_u_n_c_h_ _re_p_u_b_l_ic_an_ a_n_d_ w_a_s_ _he_a_v_i_l_y_ _in_v_o_l_v_e_d_ _in_ the_ _p_o_l_i_t_ic_a_l_ t_u_r_m_o_i_l_ t_h_at_ s_u_r_r_o_u_n_d_e_d_ the_ _F_re_n_c_h_ _R_e_v_o_l_u_t_i_on_ _o_f_ 1_8_3_0_._ _A_s_ a_ _re_s_u_l_t_ _o_f_ _h_is_ _p_o_l_i_t_ic_a_l_ a_c_t_i_v_is_m_,_ _he_ w_a_s_ a_r_re_s_t_e_d_ _re_p_e_at_e_d_l_y_,_ s_er_v_ing_ _on_e_ _j_a_i_l_ s_en_t_en_c_e_ _o_f_ s_e_v_er_a_l_ _m_on_t_h_s_._ _F_or_ _re_a_s_on_s_ t_h_at_ _re_m_a_in_ _o_b_s_c_u_re_,_ s_h_or_t_l_y_ a_f_t_er_ _h_is_ _re_le_a_s_e_ f_r_om_ _p_r_is_on_ _he_ f_o_u_g_h_t_ _in_ a_ _d_u_e_l_ a_n_d_ _d_i_e_d_ _o_f_ the_ w_o_u_n_d_s_ _he_ s_u_f_f_er_e_d_.'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-20T12:10:42.375157Z",
     "start_time": "2025-08-20T12:10:42.230397Z"
    }
   },
   "cell_type": "code",
   "source": "draw_bar(*get_token_stats(tokenizer_zh))",
   "id": "b65b82e0235d163d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "",
   "id": "a564b17de9628d7b"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
